﻿#ifndef QSINGLEINSTANCEGUARD_H
#define QSINGLEINSTANCEGUARD_H

/***************************************
 * 【文件说明】： QT程序单例保护类
 * 【使用方法】：
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 使用应用程序ID作为唯一标识符
    QString appId = QStringLiteral("MyUniqueAppId");

    SingleInstanceGuard guard(appId);
    if (guard.isAnotherInstanceRunning()) {
        qDebug() << "Another instance is already running. Exiting...";
        //可以发送带进来的参数信息
        QString message = QString(argv[1]);
        guard.sendMessageToExistingInstance(message);
        return 0;
    }

    // 创建并显示主窗口
    QMainWindow window;
    window.show();

    // 连接信号以处理来自其他实例的消息
    QObject::connect(&guard, &SingleInstanceGuard::messageReceived, [&window](const QString &message) {
        // 在这里处理消息，例如激活窗口
        if(message == "activate"){
             window.activateWindow();
             window.raise();
        }else{//或执行某些操作(如，重新启动，重新加载配置等等)
            //window.disposeMessage(message);
        }
    });
    return a.exec();
}
 * 【注意事项】：
 *  确保你的项目配置文件（如 .pro 文件）中包含了 network 模块。你需要在 .pro 文件中添加以下内容：
 *  QT += network
***************************************/

#include <QObject>
#include <QLocalSocket>
#include <QLocalServer>
#include <QTimer>
#include <QSharedMemory>

class QSingleInstanceGuard : public QObject {
    Q_OBJECT

public:
    explicit QSingleInstanceGuard(const QString &appId, QObject *parent = nullptr);
    ~QSingleInstanceGuard();

    bool isAnotherInstanceRunning();
    void sendMessageToExistingInstance(const QString &message);
private:
    void activateExistingInstance();
signals:
    void messageReceived(const QString &message);

private slots:
    void onNewConnection();
    void onReadyRead();

private:
    QSharedMemory m_sharedMemory;
    bool isRunning;
    QLocalServer *m_localServer;
    QString m_appId;

};

#endif // QSINGLEINSTANCEGUARD_H
